#include "wxslistbox.h"

#include <prep.h>

namespace {
  wxsRegisterItem<wxsListBox> Reg( _T( "ListBox" ), _T( "列表框" ), wxsTWidget, _T( "标准" ), 240 );
  WXS_ST_BEGIN( wxsListBoxStyles, _T( "" ) )
  WXS_ST_CATEGORY( "wxListBox" )
  WXS_ST( wxLB_SINGLE )
  WXS_ST( wxLB_MULTIPLE )
  WXS_ST( wxLB_EXTENDED )
  WXS_ST( wxLB_HSCROLL )
  WXS_ST( wxLB_ALWAYS_SB )
  WXS_ST( wxLB_NEEDED_SB )
  WXS_ST( wxLB_SORT )
  WXS_ST_DEFAULTS()
  WXS_ST_END()
  WXS_EV_BEGIN( wxsListBoxEvents )
  WXS_EVI( EVT_LISTBOX, wxEVT_COMMAND_LISTBOX_SELECTED, wxCommandEvent, Select )
  WXS_EVI( EVT_LISTBOX_DCLICK, wxEVT_COMMAND_LISTBOX_DOUBLECLICKED, wxCommandEvent, DClick )
  WXS_EV_END()
}

wxsListBox::wxsListBox( wxsItemResData* Data ):
  wxsWidget(
    Data,
    &Reg.Info,
    wxsListBoxEvents,
    wxsListBoxStyles ),
  DefaultSelection( -1 ) {}

void wxsListBox::OnBuildCreatingCode() {
  switch( GetLanguage() ) {
  case wxsCPP: {
    AddHeader( _T( "<wx/listbox.h>" ), GetInfo().ClassName, hfInPCH );
    Codef( _T( "%C(%W, %I, %P, %S, 0, 0, %T, %V, %N);\n" ) );
    for( size_t i = 0; i <  ArrayChoices.GetCount(); ++i ) {
      if( DefaultSelection == ( int )i ) {
        Codef( _T( "%ASetSelection( " ) );
      }
      Codef( _T( "%AAppend(%t)" ), ArrayChoices[i].wx_str() );
      if( DefaultSelection == ( int )i ) {
        Codef( _T( " )" ) );
      }
      Codef( _T( ";\n" ) );
    }
    BuildSetupWindowCode();
    return;
  }
  case wxsUnknownLanguage:
  default: {
    wxsCodeMarks::Unknown( _T( "wxsListBox::OnBuildCreatingCode" ), GetLanguage() );
  }
  }
}


wxObject* wxsListBox::OnBuildPreview( wxWindow* Parent, long Flags ) {
  wxListBox* Preview = new wxListBox( Parent, GetId(), Pos( Parent ), Size( Parent ), 0, 0, Style() );
  for( size_t i = 0; i <  ArrayChoices.GetCount(); ++i ) {
    int Val = Preview->Append( ArrayChoices[i] );
    if( ( int )i == DefaultSelection ) {
      Preview->SetSelection( Val );
    }
  }
  return SetupWindow( Preview, Flags );
}

void wxsListBox::OnEnumWidgetProperties( M_Code_unused long Flags ) {
  WXS_ARRAYSTRING( wxsListBox, ArrayChoices, _T( "Choices" ), _T( "content" ), _T( "item" ) )
  WXS_LONG( wxsListBox, DefaultSelection, _T( "Default" ), _T( "default" ), 0 )
}
